//
// Created by Leaf on 2025/8/16.
//

////////////////////////////////////////////////////////////////////////////////////
//在platformio中，点击"Open"，选择"Libraries"，搜索U8g2并安装
/////////////////////////////////////////////////////////////////////////////////////

#ifndef TRIGGERMODULE_OLED_H
#define TRIGGERMODULE_OLED_H
//
// oled.h
//

#ifndef OLED_H
#define OLED_H

#include <Arduino.h>
#include <U8g2lib.h>

// OLED显示类
class OLED {
private:
    U8G2* u8g2;  // U8g2库实例指针
    bool isInitialized;
    const uint8_t* currentFont;  // 当前字体
    uint8_t currentContrast;     // 当前对比度

    // 内部初始化函数
    void initialize(const uint8_t* font, uint8_t contrast);

public:
    // 构造函数，传入OLED类型和引脚配置
    explicit OLED(U8G2* display, const uint8_t* font = nullptr, uint8_t contrast = 255);

    // 绘制中文字符
    void drawChinese(uint8_t x, uint8_t y, const char* text);

    // 重新初始化OLED，可设置字体、对比度等参数
    void reinitialize(const uint8_t* font = nullptr, uint8_t contrast = 255);

    // 初始化OLED
    void begin(const uint8_t* font = u8g2_font_ncenB08_tr, uint8_t contrast = 255);

    // 设置屏幕翻转模式  1表示翻转显示，0表示正常显示
    void setFlipMode(uint8_t mode);

    // 清空屏幕
    void clear();

    // 显示字符串
    void drawString(uint8_t x, uint8_t y, const String& text);

    // 显示整数
    void drawInt(uint8_t x, uint8_t y, int number);

    // 显示浮点数
    void drawFloat(uint8_t x, uint8_t y, float number, uint8_t precision = 2);

    // 绘制水平线
    void drawHLine(uint8_t x, uint8_t y, uint8_t width);

    // 绘制垂直线
    void drawVLine(uint8_t x, uint8_t y, uint8_t height);

    // 绘制空心矩形（框架）
    void drawRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height);

    // 绘制实心矩形（填充）
    void fillRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height);

    /**
     * @brief 绘制位图
     * @param x 位图左上角的X坐标
     * @param y 位图左上角的Y坐标
     * @param width 位图的宽度（像素）
     * @param height 位图的高度（像素）
     * @param bitmap 指向位图数据的指针
     */
    void drawBitmap(uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t* bitmap);
    
    /**
     * @brief 绘制XBM格式位图
     * @param x 位图左上角的X坐标
     * @param y 位图左上角的Y坐标
     * @param width 位图的宽度（像素）
     * @param height 位图的高度（像素）
     * @param xbm 指向XBM格式位图数据的指针
     */
    void drawXBM(uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t* xbm);

    // 更新显示（将缓冲区内容显示到屏幕）
    void update();

    // 设置字体
    void setFont(const uint8_t* font);
};

#endif
#endif //TRIGGERMODULE_OLED_H
